package OtherTools;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import Builder.BrickSelectionManager;
import Command.LDrawColorT;
import Command.LDrawPart;
import Connectivity.GlobalConnectivityManager;
import LDraw.Support.LDrawUtilities;
import Notification.ILDrawSubscriber;
import Notification.INotificationMessage;
import Notification.NotificationCenter;
import Notification.NotificationMessageT;
import Window.MOCBuilder;
public class OverlapCheckDlg extends Dialog implements ILDrawSubscriber {
protected Object result;
protected Shell shlOverlapCheck;
private Table table;
private Button btnCheck_onlyShowOverlapped;
/**
* Create the dialog.
*
* @param parent
* @param style
*/
public OverlapCheckDlg(Shell parent, int style) {
super(parent, style);
setText("Overlab Check");
}
/**
* Open the dialog.
*
* @return the result
*/
public Object open() {
createContents();
shlOverlapCheck.open();
shlOverlapCheck.layout();
Display display = getParent().getDisplay();
while (!shlOverlapCheck.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
NotificationCenter.getInstance().removeSubscriber(this,
NotificationMessageT.LDrawPartAdded);
NotificationCenter.getInstance().removeSubscriber(this,
NotificationMessageT.LDrawPartRemoved);
NotificationCenter.getInstance().removeSubscriber(this,
NotificationMessageT.LDrawPartTransformed);
NotificationCenter.getInstance().removeSubscriber(this,
NotificationMessageT.LDrawFileActiveModelDidChanged);
return result;
}
/**
* Create contents of the dialog.
*/
private void createContents() {
shlOverlapCheck = new Shell(getParent(), getStyle());
shlOverlapCheck.setSize(500, 400);
shlOverlapCheck.setText("Overlap Check");
table = new Table(shlOverlapCheck, SWT.BORDER | SWT.FULL_SELECTION);
table.setBounds(10, 33, 474, 329);
table.setHeaderVisible(true);
table.setLinesVisible(true);
btnCheck_onlyShowOverlapped = new Button(shlOverlapCheck, SWT.CHECK);
btnCheck_onlyShowOverlapped
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
createTable();
}
});
btnCheck_onlyShowOverlapped.setBounds(325, 10, 170, 20);
btnCheck_onlyShowOverlapped.setText("List Up Overlapping Parts");
btnCheck_onlyShowOverlapped.setSelection(true);
btnNewButton = new Button(shlOverlapCheck, SWT.NONE);
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
for (LDrawPart part : partList) {
boolean isOverlapped = false;
if (part.getCollisionBoxList() == null
|| part.getCollisionBoxList().size() == 0)
isOverlapped = true;
else
isOverlapped = GlobalConnectivityManager.getInstance()
.CheckCollisionBox(part,
part.transformationMatrix());
if (isOverlapped)
part.setHidden(false);
else
part.setHidden(true);
}
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
});
btnNewButton.setBounds(10, 2, 170, 28);
btnNewButton.setText("Show Overlapping Parts");
btnShowAll = new Button(shlOverlapCheck, SWT.NONE);
btnShowAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
MOCBuilder.getInstance().showAllStep();
}
});
btnShowAll.setText("Show All");
btnShowAll.setBounds(190, 2, 73, 28);
updatePartList();
createTable();
NotificationCenter.getInstance().addSubscriber(this,
NotificationMessageT.LDrawPartAdded);
NotificationCenter.getInstance().addSubscriber(this,
NotificationMessageT.LDrawPartRemoved);
NotificationCenter.getInstance().addSubscriber(this,
NotificationMessageT.LDrawPartTransformed);
NotificationCenter.getInstance().addSubscriber(this,
NotificationMessageT.LDrawFileActiveModelDidChanged);
addSelectionListener();
}
private ArrayList<LDrawPart> partList;
private Button btnNewButton;
private Button btnShowAll;
private void createTable() {
try {
if (partList == null)
return;
table.setVisible(false);
table.removeAll();
String[] titles = { "Index", "PartName", "Color", "isOverlapped" };
for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
TableColumn column = new TableColumn(table, SWT.NULL);
column.setText(titles[loopIndex]);
}
int index = 0;
LDrawPart part = null;
for (index = 0; index < partList.size(); index++) {
part = partList.get(index);
String partName = LDrawUtilities.excludeExtensionFromPartName(
part.displayName()).toLowerCase();
LDrawColorT colorCode = part.getLDrawColor().getColorCode();
Boolean isOverlapped = false;
if (part.getCollisionBoxList() == null
|| part.getCollisionBoxList().size() == 0)
isOverlapped = null;
else
isOverlapped = GlobalConnectivityManager.getInstance()
.CheckCollisionBox(part,
part.transformationMatrix());
if (btnCheck_onlyShowOverlapped.getSelection()
&& (isOverlapped != null && isOverlapped == false))
continue;
final TableItem item = new TableItem(table, SWT.NULL);
item.setText(0, "" + index);
item.setText(1, partName);
item.setText(2,
colorCode.toString() + "(" + colorCode.getValue() + ")");
item.setText(3, ""
+ (isOverlapped == null ? "No Physical Info."
: isOverlapped));
}
for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
table.getColumn(loopIndex).pack();
}
table.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
private void updatePartList() {
partList = MOCBuilder.getInstance().getAllPartInActiveModel();
Collections.sort(partList, new Comparator<LDrawPart>() {
@Override
public int compare(LDrawPart o1, LDrawPart o2) {
int retValue = o1.displayName().compareTo(o2.displayName());
if (retValue == 0)
retValue = o1
.getLDrawColor()
.colorCode()
.toString()
.compareTo(
o2.getLDrawColor().colorCode().toString());
return retValue;
}
});
}
private boolean isNeedUpdate = true;
@Override
public void receiveNotification(NotificationMessageT messageType,
INotificationMessage msg) {
if (isNeedUpdate == true) {
isNeedUpdate = false;
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
updatePartList();
createTable();
isNeedUpdate = true;
}
});
}
}
private void addSelectionListener() {
table.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Point pt = new Point(event.x, event.y);
final TableItem item = table.getItem(pt);
if (item != null) {
if (partList == null)
return;
LDrawPart part = partList.get(Integer.parseInt(item
.getText(0)));
part.setHidden(false);
BrickSelectionManager.getInstance().clearSelection();
MOCBuilder.getInstance().getCamera()
.moveTo(part.position());
BrickSelectionManager.getInstance()
.updateScreenProjectionVerticesMapAll();
BrickSelectionManager.getInstance()
.addPartToSelection(part);
}
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
});
}
}